home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Camelot / Camelot 043 (1989-06)(Swedish User Group of Amiga)(SE)(PD)[WB].zip / Camelot 043 (1989-06)(Swedish User Group of Amiga)(SE)(PD)[WB].adf / Glib / tx81p.c < prev    next >
C/C++ Source or Header  |  1989-03-16  |  16KB  |  598 lines

  1. /*
  2.  * GLIB - a Generic LIBrarian and editor for synths
  3.  *
  4.  * TX81Z routines for Performance parameters
  5.  */
  6.  
  7. #define OVERLAY1
  8.  
  9. #include "glib.h"
  10. #include <ctype.h>
  11.  
  12. char *visnum(), *vis1num(), *viseffect(), *visass(), *viskey();
  13. char *vischan(), *visnote(), *vistdetune(), *vistout(), *vislfo();
  14. char *visponoff(), *vispvoice(), *vispshift();
  15.  
  16. static char Pbuff[17];
  17.  
  18. #define PMEMSIZE 76
  19. #define PCEDSIZE 110
  20.  
  21. /* This array contains arbitrary screen labels */
  22. struct labelinfo Ltx81p[] = {
  23. 1,17," 1      2      3      4      5      6      7      8",
  24. 2,17,"---    ---    ---    ---    ---    ---    ---    ---",
  25. 3,2,"Voice",
  26. 7,2,"Max Notes",
  27. 8,2,"Receive Ch.",
  28. 9,2,"Limit Low",
  29. 10,2,"Limit High",
  30. 11,2,"Detune",
  31. 12,2,"Note Shift",
  32. 13,2,"Volume",
  33. 14,2,"Out Assign",
  34. 15,2,"LFO Select",
  35. 16,2,"Micro Tune",
  36. 21,0,"-------------------------+",
  37. 22,0,"Auto-Note:               |",
  38. 23,0,"                         |",
  39. -1,-1,NULL
  40. };
  41.  
  42. /* This array defines all the editable parameters. */
  43. struct paraminfo Ptx81p[] = {
  44. "autopitch",    "Pitch",22, 11, 22, 17, visnum, 0, 127, 60, 0,
  45. "autovol",    "Vol",    23, 0, 23, 4, visnum, 0, 127, 63, 0,
  46. "autodur",    "Dur",    23, 8, 23, 12, visnum, 1, 20, 5, 0,
  47. "autochan",    "Chan",    23, 16, 23, 21, visnum, 1, 16, 1, 0,
  48.  
  49. "op1max",    NULL, -1, -1, 7, 18, visnum, 0, 8, 0, 0,
  50. "op1voice",    NULL, -1, -1, 3, 17, vispvoice, 0, 159, 0, 0,
  51. "op1rec",    NULL, -1, -1, 8, 18, vischan, 0, 16, 0, 0,
  52. "op1liml",    NULL, -1, -1, 9, 18, visnote, 0, 127, 0, 0,
  53. "op1limh",    NULL, -1, -1, 10, 18, visnote, 0, 127, 0, 0,
  54. "op1detune",    NULL, -1, -1, 11, 18, vistdetune, 0, 14, 0, 0,
  55. "op1shift",    NULL, -1, -1, 12, 18, vispshift, 0, 48, 0, 0,
  56. "op1vol",    NULL, -1, -1, 13, 18, visnum, 0, 99, 0, 0,
  57. "op1out",    NULL, -1, -1, 14, 18, vistout, 0, 3, 0, 0,
  58. "op1lfo",    NULL, -1, -1, 15, 18, vislfo, 0, 3, 0, 0,
  59. "op1micro",    NULL, -1, -1, 16, 18, visponoff, 0, 1, 0, 0,
  60.  
  61. "op2max",    NULL, -1, -1, 7, 25, visnum, 0, 8, 0, 0,
  62. "op2voice",    NULL, -1, -1, 3, 24, vispvoice, 0, 159, 0, 0,
  63. "op2rec",    NULL, -1, -1, 8, 25, vischan, 0, 16, 0, 0,
  64. "op2liml",    NULL, -1, -1, 9, 25, visnote, 0, 127, 0, 0,
  65. "op2limh",    NULL, -1, -1, 10, 25, visnote, 0, 127, 0, 0,
  66. "op2detune",    NULL, -1, -1, 11, 25, vistdetune, 0, 14, 0, 0,
  67. "op2shift",    NULL, -1, -1, 12, 25, vispshift, 0, 48, 0, 0,
  68. "op2vol",    NULL, -1, -1, 13, 25, visnum, 0, 99, 0, 0,
  69. "op2out",    NULL, -1, -1, 14, 25, vistout, 0, 3, 0, 0,
  70. "op2lfo",    NULL, -1, -1, 15, 25, vislfo, 0, 3, 0, 0,
  71. "op2micro",    NULL, -1, -1, 16, 25, visponoff, 0, 1, 0, 0,
  72.  
  73. "op3max",    NULL, -1, -1, 7, 32, visnum, 0, 8, 0, 0,
  74. "op3voice",    NULL, -1, -1, 3, 31, vispvoice, 0, 159, 0, 0,
  75. "op3rec",    NULL, -1, -1, 8, 32, vischan, 0, 16, 0, 0,
  76. "op3liml",    NULL, -1, -1, 9, 32, visnote, 0, 127, 0, 0,
  77. "op3limh",    NULL, -1, -1, 10, 32, visnote, 0, 127, 0, 0,
  78. "op3detune",    NULL, -1, -1, 11, 32, vistdetune, 0, 14, 0, 0,
  79. "op3shift",    NULL, -1, -1, 12, 32, vispshift, 0, 48, 0, 0,
  80. "op3vol",    NULL, -1, -1, 13, 32, visnum, 0, 99, 0, 0,
  81. "op3out",    NULL, -1, -1, 14, 32, vistout, 0, 3, 0, 0,
  82. "op3lfo",    NULL, -1, -1, 15, 32, vislfo, 0, 3, 0, 0,
  83. "op3micro",    NULL, -1, -1, 16, 32, visponoff, 0, 1, 0, 0,
  84.  
  85. "op4max",    NULL, -1, -1, 7, 39, visnum, 0, 8, 0, 0,
  86. "op4voice",    NULL, -1, -1, 3, 38, vispvoice, 0, 159, 0, 0,
  87. "op4rec",    NULL, -1, -1, 8, 39, vischan, 0, 16, 0, 0,
  88. "op4liml",    NULL, -1, -1, 9, 39, visnote, 0, 127, 0, 0,
  89. "op4limh",    NULL, -1, -1, 10, 39, visnote, 0, 127, 0, 0,
  90. "op4detune",    NULL, -1, -1, 11, 39, vistdetune, 0, 14, 0, 0,
  91. "op4shift",    NULL, -1, -1, 12, 39, vispshift, 0, 48, 0, 0,
  92. "op4vol",    NULL, -1, -1, 13, 39, visnum, 0, 99, 0, 0,
  93. "op4out",    NULL, -1, -1, 14, 39, vistout, 0, 3, 0, 0,
  94. "op4lfo",    NULL, -1, -1, 15, 39, vislfo, 0, 3, 0, 0,
  95. "op4micro",    NULL, -1, -1, 16, 39, visponoff, 0, 1, 0, 0,
  96.  
  97. "op5max",    NULL, -1, -1, 7, 46, visnum, 0, 8, 0, 0,
  98. "op5voice",    NULL, -1, -1, 3, 45, vispvoice, 0, 159, 0, 0,
  99. "op5rec",    NULL, -1, -1, 8, 46, vischan, 0, 16, 0, 0,
  100. "op5liml",    NULL, -1, -1, 9, 46, visnote, 0, 127, 0, 0,
  101. "op5limh",    NULL, -1, -1, 10, 46, visnote, 0, 127, 0, 0,
  102. "op5detune",    NULL, -1, -1, 11, 46, vistdetune, 0, 14, 0, 0,
  103. "op5shift",    NULL, -1, -1, 12, 46, vispshift, 0, 48, 0, 0,
  104. "op5vol",    NULL, -1, -1, 13, 46, visnum, 0, 99, 0, 0,
  105. "op5out",    NULL, -1, -1, 14, 46, vistout, 0, 3, 0, 0,
  106. "op5lfo",    NULL, -1, -1, 15, 46, vislfo, 0, 3, 0, 0,
  107. "op5micro",    NULL, -1, -1, 16, 46, visponoff, 0, 1, 0, 0,
  108.  
  109. "op6max",    NULL, -1, -1, 7, 53, visnum, 0, 8, 0, 0,
  110. "op6voice",    NULL, -1, -1, 3, 52, vispvoice, 0, 159, 0, 0,
  111. "op6rec",    NULL, -1, -1, 8, 53, vischan, 0, 16, 0, 0,
  112. "op6liml",    NULL, -1, -1, 9, 53, visnote, 0, 127, 0, 0,
  113. "op6limh",    NULL, -1, -1, 10, 53, visnote, 0, 127, 0, 0,
  114. "op6detune",    NULL, -1, -1, 11, 53, vistdetune, 0, 14, 0, 0,
  115. "op6shift",    NULL, -1, -1, 12, 53, vispshift, 0, 48, 0, 0,
  116. "op6vol",    NULL, -1, -1, 13, 53, visnum, 0, 99, 0, 0,
  117. "op6out",    NULL, -1, -1, 14, 53, vistout, 0, 3, 0, 0,
  118. "op6lfo",    NULL, -1, -1, 15, 53, vislfo, 0, 3, 0, 0,
  119. "op6micro",    NULL, -1, -1, 16, 53, visponoff, 0, 1, 0, 0,
  120.  
  121. "op7max",    NULL, -1, -1, 7, 60, visnum, 0, 8, 0, 0,
  122. "op7voice",    NULL, -1, -1, 3, 59, vispvoice, 0, 159, 0, 0,
  123. "op7rec",    NULL, -1, -1, 8, 60, vischan, 0, 16, 0, 0,
  124. "op7liml",    NULL, -1, -1, 9, 60, visnote, 0, 127, 0, 0,
  125. "op7limh",    NULL, -1, -1, 10, 60, visnote, 0, 127, 0, 0,
  126. "op7detune",    NULL, -1, -1, 11, 60, vistdetune, 0, 14, 0, 0,
  127. "op7shift",    NULL, -1, -1, 12, 60, vispshift, 0, 48, 0, 0,
  128. "op7vol",    NULL, -1, -1, 13, 60, visnum, 0, 99, 0, 0,
  129. "op7out",    NULL, -1, -1, 14, 60, vistout, 0, 3, 0, 0,
  130. "op7lfo",    NULL, -1, -1, 15, 60, vislfo, 0, 3, 0, 0,
  131. "op7micro",    NULL, -1, -1, 16, 60, visponoff, 0, 1, 0, 0,
  132.  
  133. "op8max",    NULL, -1, -1, 7, 67, visnum, 0, 8, 0, 0,
  134. "op8voice",    NULL, -1, -1, 3, 66, vispvoice, 0, 159, 0, 0,
  135. "op8rec",    NULL, -1, -1, 8, 67, vischan, 0, 16, 0, 0,
  136. "op8liml",    NULL, -1, -1, 9, 67, visnote, 0, 127, 0, 0,
  137. "op8limh",    NULL, -1, -1, 10, 67, visnote, 0, 127, 0, 0,
  138. "op8detune",    NULL, -1, -1, 11, 67, vistdetune, 0, 14, 0, 0,
  139. "op8shift",    NULL, -1, -1, 12, 67, vispshift, 0, 48, 0, 0,
  140. "op8vol",    NULL, -1, -1, 13, 67, visnum, 0, 99, 0, 0,
  141. "op8out",    NULL, -1, -1, 14, 67, vistout, 0, 3, 0, 0,
  142. "op8lfo",    NULL, -1, -1, 15, 67, vislfo, 0, 3, 0, 0,
  143. "op8micro",    NULL, -1, -1, 16, 67, visponoff, 0, 1, 0, 0,
  144.  
  145. "microtune",    "Micro Tune Table", 19, 32, 19, 53, visnum, 0, 12, 0, 0,
  146. "microkey",    "Micro Tune Key", 20, 32, 20, 53, viskey, 0, 11, 0, 0,
  147. "assmode",    "Assign Mode", 21, 32, 21, 53, visass, 0, 1, 0, 0,
  148. "effect",    "Effect Select", 22, 32, 22, 53, viseffect, 0, 3, 0, 0,
  149. NULL,    NULL, -1, -1, -1, -1, visnum, 0, 0, 0, 0
  150. };
  151.  
  152. char *tx81voices[] = {
  153.     "GrandPiano", "Uprt piano", "Deep Grd", "HonkeyTonk", "Elec Grand",
  154.     "Fuzz Piano", "SkoolPiano", "Thump Pno", "LoTine81Z", "HiTine81Z",
  155.     "ElectroPno", "NewElectro", "DynomiteEP", "DynoWurlie", "Wood Piano",
  156.     "Reed Piano", "PercOrgan", "16 8 4 2 F", "PumpOrgan", "<6 Tease>",
  157.     "Farcheeza", "Small Pipe", "Big Church", "AnalogOrgn", "Thin Clav",
  158.     "EZ Clav", "Fuzz Clavi", "LiteHarpsi", "RichHarpsi", "Celeste",
  159.     "BriteCelst", "Squeezebox",
  160.  
  161.     "Trumpet81Z", "Full Brass", "Flugelhorn", "ChorusBras", "FrenchHorn",
  162.     "AtackBrass", "SpitBoneBC", "Horns BC", "MelloTenor", "RaspAlto",
  163.     "Flute", "Pan Floot", "Bassoon", "Oboe", "Clarinet",
  164.     "Harmonica", "DoubleBass", "BowCello", "BoxCello", "SoloViolin",
  165.     "HiString 1", "LowString", "Pizzicato", "Harp", "ReverbStrg",
  166.     "SynString", "Voices", "HarmoPad", "FanfarTpts", "HiString 2",
  167.     "PercFlute", "BreathOrgn",
  168.  
  169.     "NylonGuit", "Guitar #1", "TwelveStrg", "Funky Pick", "AllThatJaz",
  170.     "HeavyMetal", "Old Banjo", "Zither", "ElecBass 1", "SqncrBass",
  171.     "SynFunkBas", "ElecBass 2", "AnalogBass", "Jaco Bass", "LatelyBass",
  172.     "MonophBass", "StadiumSol", "TrumptSolo", "BCSexyPhon", "Lyrisyn",
  173.     "WarmSquare", "Sync Lead", "MellowSqar", "Jazz Flute", "HeavyLead",
  174.     "Java Jive", "Xylophone", "GreatVibes    ", "Sitar", "Bell Pad",
  175.     "PlasticHit", "DigiAnnie",
  176.  
  177.     "BaadBreath", "VocalNuts", "KrstlChoir", "Metalimba", "WaterGlass",
  178.     "BowedBell", ">>WOW<<", "Fuzzy Koto", "Spc Midiot", "Gurgle",
  179.     "Hole in 1", "Birds", "MalibuNite", "Helicopter", "Flight Sim",
  180.     "Brthbells", "Storm Wind", "Alarm Call", "Racing Car", "Whistling",
  181.     "Space Talk", "Space Vibe", "Timpani", "FM Hi-Hats", "Bass Drum",
  182.     "Tube Bells", "Noise Shot", "Snare 1", "Snare 2", "Hand Drum",
  183.     "Synballs", "Efem Toms"
  184. };
  185.  
  186. /*
  187.  * tx8pdin
  188.  *
  189.  * Take info from 'data' and stuff values in the P array, by using
  190.  * the setval (and setopval) functions.  The data is in PMEM format.
  191.  */
  192.  
  193. tx8pdin(data)
  194. char *data;
  195. {
  196.     int dop, n, msb;
  197.  
  198.     for ( n=1; n<=8; n++ ) {
  199.         dop = (n-1)*8;
  200.         setopval(n,"max",data[0+dop] & 017);
  201.         msb = (data[0+dop]>>4)&01;
  202.         setopval(n,"voice",128*msb + (data[1+dop]&0177));
  203.         setopval(n,"rec",data[2+dop] & 037);
  204.         setopval(n,"liml",data[3+dop] & 0177);
  205.         setopval(n,"limh",data[4+dop] & 0177);
  206.         setopval(n,"detune",data[5+dop] & 017);
  207.         setopval(n,"shift",data[6+dop] & 077);
  208.         setopval(n,"vol",data[7+dop] & 0177);
  209.         setopval(n,"out",(data[0+dop]>>5) & 03);
  210.         setopval(n,"lfo",(data[2+dop]>>5) & 03);
  211.         setopval(n,"micro",(data[6+dop]>>6) & 01);
  212.     }
  213.     setval("microtune",data[64] & 017);
  214.     setval("assmode",data[65] & 01);
  215.     setval("effect",(data[65]>>1) & 03);
  216.     setval("microkey",(data[65]>>3) & 017);
  217.  
  218.     setval("autochan",Channel);
  219. }
  220.  
  221. /*
  222.  * tx8pdout
  223.  *
  224.  * Take (possibly changed) parameters values out of the P array and
  225.  * put them back into 'data'.
  226.  */
  227.  
  228. tx8pdout(data)
  229. char *data;
  230. {
  231.     int dop, n, voicenum, msb;
  232.  
  233.     for ( n=1; n<=8; n++ ) {
  234.         dop = (n-1)*8;
  235.         voicenum = getopval(n,"voice");
  236.         msb = (voicenum>>7)&01;
  237.         data[0+dop] = getopval(n,"max") | (msb<<4)
  238.                 | getopval(n,"out")<<5;
  239.         data[1+dop] = voicenum & 0177;
  240.         data[2+dop] = getopval(n,"lfo")<<5 | getopval(n,"rec");
  241.         data[3+dop] = getopval(n,"liml");
  242.         data[4+dop] = getopval(n,"limh");
  243.         data[5+dop] = getopval(n,"detune");
  244.         data[6+dop] = getopval(n,"micro")<<6 | getopval(n,"shift");
  245.         data[7+dop] = getopval(n,"vol");
  246.     }
  247.     data[64] = getval("microtune");
  248.     data[65] = getval("microkey")<<3 | getval("effect")<<1
  249.             | getval("assmode");
  250.     Channel = getval("autochan");
  251. }
  252.  
  253. tx8psedit(data)
  254. char *data;
  255. {
  256.     char pdata[PCEDSIZE];
  257.     int n, cksum, c;
  258.     char *p;
  259.  
  260.     clrdata(pdata,PCEDSIZE);
  261.     pmemtopced(data,pdata);
  262.     sendmidi(0xf0);
  263.     sendmidi(0x43);
  264.     sendmidi(Channel-1);    /* channel # */
  265.     sendmidi(0x7e);        /* format type */
  266.     sendmidi(0x00);        /* byte count */
  267.     sendmidi(0x78);        /* byte count */
  268.     p = "LM  8976PE";
  269.     cksum = 0;
  270.     while ( (c=(int)(*p++)) != '\0' ) {
  271.         sendmidi(c);
  272.         cksum += c;
  273.     }
  274.     for ( n=0; n<PCEDSIZE; n++ ) {
  275.         c = (int)(pdata[n]);
  276.         sendmidi(c);
  277.         cksum += c;
  278.     }
  279.     sendmidi((-cksum) & 0x7f);
  280.     sendmidi(EOX);
  281. }
  282.  
  283. /* Convert PMEM to PCED format */
  284. pmemtopced(indata,outdata)
  285. char *indata, *outdata;
  286. {
  287.     int n, inop, outop;
  288.  
  289.     for ( n=1; n<=8; n++ ) {
  290.         inop = (n-1)*8;
  291.         outop = (n-1)*12;
  292.  
  293.         outdata[0+outop] = indata[0+inop] & 017;
  294.  
  295.         outdata[1+outop] = (indata[0+inop]>>4)&01;
  296.         outdata[2+outop] = indata[1+inop] & 0177;
  297.         outdata[3+outop] = indata[2+inop] & 037;
  298.         outdata[4+outop] = indata[3+inop] & 0177;
  299.         outdata[5+outop] = indata[4+inop] & 0177;
  300.         outdata[6+outop] = indata[5+inop] & 017;
  301.         outdata[7+outop] = indata[6+inop] & 077;
  302.         outdata[8+outop] = indata[7+inop] & 0177;
  303.         outdata[9+outop] = (indata[0+inop]>>5) & 03;
  304.         outdata[10+outop] = (indata[2+inop]>>5) & 03;
  305.         outdata[11+outop] = (indata[6+inop]>>6) & 01;
  306.     }
  307.     outdata[96] = indata[64] & 017;
  308.     outdata[97] = indata[65] & 01;
  309.     outdata[98] = (indata[65]>>1) & 03;
  310.     outdata[99] = (indata[65]>>3) & 017;
  311.     for ( n=0; n<10; n++ )
  312.         outdata[100+n] = indata[66+n];
  313. }
  314.  
  315. /* send a bulk performance dump to the tx81z */
  316. tx8psbulk(data)
  317. char *data;
  318. {
  319.     int c, v, n, cksum;
  320.     char *p;
  321.  
  322.     sendmidi(0xf0);
  323.     sendmidi(0x43);
  324.     sendmidi(Channel-1);    /* Channel # */
  325.     sendmidi(0x7e);
  326.     sendmidi(0x13);
  327.     sendmidi(0x0a);
  328.     p = "LM  8976PM";
  329.     cksum = 0;
  330.     while ( (c=(int)(*p++)) != '\0' ) {
  331.         sendmidi(c);
  332.         cksum += c;
  333.     }
  334.     /* send 32 PMEM's worth of data */
  335.     for ( v=0; v<32; v++ ) {
  336.         for ( n=0; n<PMEMSIZE; n++ ) {
  337.             /* 24 PMEM's are editable, but the bulk dump has 32 */
  338.             if ( v >= 24 )
  339.                 c = 0;
  340.             else
  341.                 c = VOICEBYTE(data,v,n);
  342.             sendmidi(c & 0xff);
  343.             cksum += c;
  344.         }
  345.     }
  346.     sendmidi((-cksum) & 0x7f);
  347.     sendmidi(0xf7);
  348. }
  349.  
  350. /* Request and read a bulk performance dump from the TX81Z */
  351. tx8pgbulk(data)
  352. char *data;
  353. {
  354.     int c, n, v, b1, b2, cksum, ret = 1;
  355.     long begin, toolong;
  356.     char *p;
  357.  
  358.     flushmidi();
  359.  
  360.     sendmidi(0xf0);
  361.     sendmidi(0x43);
  362.     sendmidi(0x20 | (Channel-1));    /* Channel # */
  363.     sendmidi(0x7e);
  364.     p = "LM  8976PM";
  365.     while ( (c=(int)(*p++)) != '\0' )
  366.         sendmidi(c);
  367.     sendmidi(EOX);
  368.  
  369.     begin = milliclock();
  370.     toolong = begin + 1000 * TIMEOUT;
  371.  
  372.     /* wait for the x43 byte starting the dump */
  373.     while ( milliclock() < toolong ) {
  374.         if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x43 )
  375.             break;
  376.     }
  377.     if ( c != 0x43 ) {
  378.         Reason = "Timeout waiting for 0x43";
  379.         goto getout;
  380.     }
  381.     /* get the 14 bytes preceeding the data */
  382.     for ( cksum=n=0; n<14; n++ ) {
  383.         /* twiddle your thumbs, but not forever */
  384.         while ( ! STATMIDI ) {
  385.             if ( milliclock() > toolong )
  386.                 goto timeout;    /* the end of an era */
  387.         }
  388.         c = getmidi();
  389.         if(n >= 4)
  390.             cksum += c; /* start of LM... keyword */
  391.     }
  392.     /* 32 memories are dumped */
  393.     for ( v=0; v<32; v++ ) {
  394.         for ( n=0; n<PMEMSIZE; n++ ) {
  395.             /* twiddle your thumbs, but not forever */
  396.             while ( ! STATMIDI ) {
  397.                 if ( milliclock() > toolong )
  398.                     goto timeout;    /* the end of an era */
  399.             }
  400.             c = (getmidi() & 0xff);
  401.             /* Ignore non-data bytes ? */
  402.             if ( c & 0x80 )
  403.                 continue;
  404.             /* compute checksum */
  405.             cksum += c;
  406.             /* Only 24 memories are used */
  407.             if ( v < 24 )
  408.                 VOICEBYTE(data,v,n) = c;
  409.         }
  410.     }
  411. timeout:
  412.     if ( v < 32 ) {
  413.         Reason = "Timeout while reading!";
  414.         goto getout;
  415.     }
  416.     b1 = (getmidi() & 0xff);    /* Checksum */
  417.     b2 = (getmidi() & 0xff);    /* EOX */
  418.     cksum = (-cksum) & 0x7f;    /* convert to what we must match */
  419.     if ( b2 != EOX )
  420.         Reason = "EOX not received";
  421.     else if ( b1 != cksum ) {
  422.         static char ckbuff[80];
  423.         sprintf(ckbuff,"Checksum doesn't match (got %d expected %d)",b1,cksum);
  424.         /* Reason = "Checksum doesn't match"; */
  425.         Reason = ckbuff;
  426.     }
  427.     else {
  428.         Reason = "";
  429.         ret = 0;    /* all's well */
  430.     }
  431. getout:
  432.     return(ret);
  433. }
  434.  
  435. char *
  436. tx8pnof(data)
  437. char *data;
  438. {
  439.     int n;
  440.  
  441.     for ( n=0; n<10; n++ )
  442.         Pbuff[n] = data[66+n];
  443.     Pbuff[10] = '\0';
  444.     return(Pbuff);
  445.  
  446. tx8psnof(data,name)
  447. char *data, *name;
  448. {
  449.     int n;
  450.  
  451.     for ( n=0; name[n]!='\0' && n<10; n++ )
  452.         data[66+n] = name[n];
  453.     for ( ; n<10; n++ )
  454.         data[66+n] = ' ';
  455.  
  456. char *
  457. visass(v)
  458. {
  459.     switch(v){
  460.     case 0: return("normal");
  461.     case 1: return("alternate");
  462.     }
  463.     return("");
  464. }
  465.  
  466. char *
  467. viskey(v)
  468. {
  469.     switch(v){
  470.     case 0: return("C");
  471.     case 1: return("C#");
  472.     case 2: return("D");
  473.     case 3: return("D#");
  474.     case 4: return("E");
  475.     case 5: return("F");
  476.     case 6: return("F#");
  477.     case 7: return("G");
  478.     case 8: return("G#");
  479.     case 9: return("A");
  480.     case 10: return("A#");
  481.     case 11: return("B");
  482.     }
  483.     return("");
  484. }
  485.  
  486. char *
  487. viseffect(v)
  488. {
  489.     switch(v){
  490.     case 0: return("none");
  491.     case 1: return("delay");
  492.     case 2: return("pan");
  493.     case 3: return("chord");
  494.     }
  495.     return("");
  496. }
  497.  
  498. char *
  499. vischan(v)
  500. {
  501.     if ( v >= 0 && v <= 15 ) {
  502.         sprintf(Pbuff,"%d",v+1);
  503.         return(Pbuff);
  504.     }
  505.     if ( v == 16 )
  506.         return("omni");
  507.     return("");
  508. }
  509.  
  510. char *
  511. visnote(v)
  512. {
  513.     int octave;
  514.  
  515.     octave = (v/12) - 2;
  516.     sprintf(Pbuff,"%s%d",viskey(v%12),octave);
  517.     return(Pbuff);
  518. }
  519.  
  520. char *
  521. vispshift(v)
  522. {
  523.     sprintf(Pbuff,"%d",v-24);
  524.     return(Pbuff);
  525. }
  526.  
  527. char *
  528. vistdetune(v)
  529. {
  530.     sprintf(Pbuff,"%d",v-7);
  531.     return(Pbuff);
  532. }
  533.  
  534. char *
  535. vistout(v)
  536. {
  537.     switch (v) {
  538.     case 0: return("off");
  539.     case 1: return("I");
  540.     case 2: return("II");
  541.     case 3: return("I+II");
  542.     }
  543.     return("");
  544. }
  545.  
  546. char *
  547. vislfo(v)
  548. {
  549.     switch (v) {
  550.     case 0: return("off");
  551.     case 1: return("inst1");
  552.     case 2: return("inst2");
  553.     case 3: return("vib");
  554.     }
  555.     return("");
  556. }
  557.  
  558. char *
  559. visponoff(v)
  560. {
  561.     switch(v){
  562.     case 0: return("off");
  563.     case 1: return("on");
  564.     }
  565.     return("");
  566. }
  567.  
  568. char *
  569. vispvoice(v)
  570. {
  571.     char *p, *prefixes = "IABCD";
  572.     int bank, vnum, vindex;
  573.  
  574.     bank = v/32;
  575.     vnum = (v%32) + 1;
  576.     sprintf(Pbuff,vnum<10?"%c0%d":"%c%d",prefixes[bank],vnum);
  577.     if ( bank > 0 ) {
  578.         vindex = (bank-1)*32+vnum-1;
  579.         if ( vindex >= 0 && vindex < 128 ) {
  580.             strcat(Pbuff,"~d~l~l~l");
  581.             p = tx81voices[vindex];
  582.             if ( strlen(p) <= 5 )
  583.                 strcat(Pbuff,p);
  584.             else {
  585.                 char buff[11];
  586.                 strcpy(buff,p);
  587.                 buff[5] = '\0';
  588.                 strcat(Pbuff,buff);
  589.                 strcat(Pbuff,"~d~l~l~l~l~l");
  590.                 strcat(Pbuff,&p[5]);
  591.             }
  592.         }
  593.     }
  594.     return(Pbuff);
  595. }
  596.